kubernetes集群环境搭建
一、前置知识点
目前生产部署Kubernetes 集群主要有两种方式:
kubeadm
Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
二进制包
从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。
Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。
二、kubeadm 部署方式介绍
kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:
- 创建一个Master 节点kubeadm init
- 将Node 节点加入到当前集群中$ kubeadm join <Master 节点的IP 和端口>
三、安装要求
在开始之前,部署Kubernetes 集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统CentOS7.x-86_x64
- 硬件配置:2GB 或更多RAM,2 个CPU 或更多CPU,硬盘30GB 或更多
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止swap 分区
四、最终目标
- 在所有节点上安装Docker 和kubeadm
- 部署Kubernetes Master
- 部署容器网络插件
- 部署Kubernetes Node,将节点加入Kubernetes 集群中
- 部署Dashboard Web 页面,可视化查看Kubernetes 资源
五、准备环境
角色 | IP地址 | 组件 |
---|---|---|
master01 | 192.168.5.3 | docker,kubectl,kubeadm,kubelet |
node01 | 192.168.5.4 | docker,kubectl,kubeadm,kubelet |
node02 | 192.168.5.5 | docker,kubectl,kubeadm,kubelet |
六、环境初始化
1.检查操作系统的版本
此方式下安装kubernetes集群要求Centos版本要在7.5或之上
1 | [root@master ~]# cat /etc/redhat-release |
2.主机名解析
为了方便集群节点间的直接调用,在这个配置一下主机名解析,企业中推荐使用内部DNS服务器
主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容
1 | 192.168.5.3 master |
3.时间同步
kubernetes要求集群中的节点时间必须精确一直,这里使用chronyd服务从网络同步时间
启动chronyd服务
1 | [root@master ~]# systemctl start chronyd |
外网环境可以使用进行 ntpdate 同步 ntp1.aliyun.com 时间
1 | [root@localhost ~]# yum install ntpdate -y |
企业中建议配置内部的同步时间服务器
4.禁用iptable和firewalld服务
kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
1.关闭firewalld服务
1 | [root@master ~]# systemctl stop firewalld |
2.关闭iptables服务
1 | [root@master ~]# systemctl stop iptables |
5.禁用selinux
selinux是linux系统一下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
编辑/etc/selinux/config 文件
1 | [root@master ~]# vim /etc/selinux/config |
修改SELINUX的值为disable
1 | SELINUX=disabled |
- 注意修改完毕之后需要重启linux服务
6.禁用swap分区
swap分区值的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用sqap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
编辑分区配置文件/etc/fstab,注释掉swap分区一行
1 | [root@master ~]# vim /etc/fstab |
注释掉 /dev/mapper/centos-swap swap
1 | # /dev/mapper/centos-swap swap |
- 注意修改完毕之后需要重启linux服务
7.修改linux的内核参数
修改linux的内核采纳数,添加网桥过滤和地址转发功能
编辑/etc/sysctl.d/kubernetes.conf文件,
1 | [root@master ~]# vim /etc/sysctl.d/kubernetes.conf |
添加如下配置:
1 | net.bridge.bridge-nf-call-ip6tables = 1 |
重新加载配置
1 | [root@master ~]# sysctl -p |
加载网桥过滤模块
1 | [root@master ~]# modprobe br_netfilter |
查看网桥过滤模块是否加载成功
1 | [root@master ~]# lsmod | grep br_netfilter |
8.配置ipvs功能
在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
1.安装ipset和ipvsadm
1 | [root@master ~]# yum install ipset ipvsadmin -y |
若提示:No package ipvsadmin available
请使用
1 | [root@master ~]# yum install ipvsadm |
2.添加需要加载的模块写入脚本文件
1 | [root@master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules |
3.为脚本添加执行权限
1 | [root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules |
4.执行脚本文件
1 | [root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules |
5.查看对应的模块是否加载成功
1 | [root@master ~]# lsmod | grep -e -ip_vs -e nf_conntrack_ipv4 |
安装问题
若提示:
1 | 没有可用软件包 ipvsadmin。 |
请使用
1 | [root@master ~]# yum install ipvsadm |
其他方式(不一定可行)
当出现这个提示的时候,Linux 是在告诉我们 yum 源中已经没有对应的安装包了,此刻需要我们安装 epel 。
何为 epel ,全称为 Extra Packages for Enterprise Linux 企业版 Linux 额外包,需要我们更新下 epel 这个第三方库
1 | yum install -y epel-release |
9.安装docker
1.切换镜像源
1 | [root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo |
2.查看当前镜像源中支持的docker版本
1 | [root@master ~]# yum list docker-ce --showduplicates |
3.安装特定版本的docker-ce
必须制定–setopt=obsoletes=0,否则yum会自动安装更高版本
1 | [root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y |
4.添加一个配置文件
Docker 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs
1 | [root@master ~]# mkdir /etc/docker |
5.启动dokcer
1 | [root@master ~]# systemctl restart docker |
安装问题
1 | -bash: wget: 未找到命令 |
原因是没有安装wget,输入命令:yum -y install wget ,wget及其依赖将会被安装
1 | yum -y install wget |
查看wget 是否安装
1 | rpm -qa | grep "wget" |
10 安装Kubernetes组件
1.由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
2.编辑/etc/yum.repos.d/kubernetes.repo
1 | [root@master ~]# vim /etc/yum.repos.d/kubernetes.repo |
添加下面的配置
1 | [kubernetes] |
也可将上面步骤直接化简为创建写入
1 | [root@master ~]# cat <<EOF> /etc/yum.repos.d/kubernetes.repo |
安装问题
国内地址报错;
1 | https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/repodata/repomd.xml: [Errno -1] repomd.xml signature could not be verified for kubernetes |
阿里云镜像仓库地址,由http://mirror.aliyun.com 变为 https://mirrors.aliyun.com, 注意测试地址
3.安装kubeadm、kubelet和kubectl
1 | [root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y |
查看kubeadm、kubelet、kubectl版本
1 | kubelet --version |
安装问题
提示
1 | e3438a5f740b3a907758799c3be2512a4b5c64dbe30352b2428788775c6b359e-kubectl-1.13.3-0.x86_64.rpm 的公钥尚未安装 |
解决:使用 yum install xxx.rpm –nogpgcheck 命令格式跳过公钥检查,比如跳过kubectl和kubeadm的公钥检查如下命令
注意顺序 kubelet kubectl kubeadm
1 | yum install --setopt=obsoletes=0 kubelet-1.17.4-0 --nogpgcheck -y |
4.配置kubelet的cgroup
编辑/etc/sysconfig/kubelet
1 | [root@master ~]# vim /etc/sysconfig/kubelet |
添加下面的配置
1 | KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" |
5.设置kubelet开机自启
1 | [root@master ~]# systemctl enable kubelet |
11.准备集群镜像
在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
1 | [root@master ~]# kubeadm config images list |
下载镜像
此镜像kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替换方案
1 | [root@master ~]# images=( |
1 | [root@master ~]# for imageName in ${images[@]};do |
或者
一般地,国内无法直接下载 k8s.gcr.io 的镜像。方式有二:
1、在初始化k8s时,使用阿里云镜像地址,此地址可以顺利下载,见下初始化。
2、下载好前述镜像。使用如下脚本pullk8s.sh(注意脚本必须添加x属性):
1 | touch pullk8s.sh |
1 | #!/bin/bash |
赋权限
1 | chmod +x pullk8s.sh |
执行
1 | bash pullk8s.sh (或 ./pullk8s.sh) |
12.集群初始化
下面的操作只需要在master节点上执行即可
创建集群
1 | [root@master ~]# kubeadm init \ |
安装完成提示
1 | Your Kubernetes control-plane has initialized successfully! |
1 |
|
安装问题
1 | [root@localhost ~]# kubeadm init \ |
原因 kubelet 和 kubeadm 版本不一致
1 |
|
解决办法
1 | [root@localhost ~]# yum -y remove kubelet |
安装问题
1 | error execution phase upload-config/kubelet: Error writing Crisocket information for the control-plane node: timed out waiting for the condition |
解决办法
1 | swapoff -a && kubeadm reset && systemctl daemon-reload && systemctl restart kubelet && iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X |
重新执行
1 | [root@localhost ~]# kubeadm init \ |
下面的操作只需要在node节点上执行即可
1 | kubeadm join 192.168.5.3:6443 --token ptga1f.5xzhj4vlb2ulyoyq \ |
安装问题
1 | [root@localhost ~]# kubeadm join 192.168.5.3:6443 --token ptga1f.5xzhj4vlb2ulyoyq --discovery-token-ca-cert-hash sha256:02e3b1b30ade0998bc6d70453d1a0c9143ca7e802fea9ef01e065973816bed56 |
只有这个警告,下面没有其他错误信息
解决办法:
这个错误很可能是由于node节点和master节点的服务器时间不一致导致的。
先同步服务器时间,再重新kubeadm join。
1 | [root@localhost ~]# yum install ntpdate -y |
安装问题
1 | error execution phase preflight: [preflight] Some fatal errors occurred: |
原因:已经加入过一次,需要先清除,重置后再加入
在node节点执行kubeadm reset
1 | [root@localhost ~]# kubeadm reset |
安装问题
1 | [root@node2 ~]# kubeadm join 192.168.5.3:6443 --token ptga1f.5xzhj4vlb2ulyoyq --discovery-token-ca-cert-hash sha256:02e3b1b30ade0998bc6d70453d1a0c9143ca7e802fea9ef01e065973816bed56 |
解决办法是: token过期了,24小时内有效果的,所以可以重新生成token
主节点执行
1 | [root@localhost ~]# kubeadm token list |
1 | kubeadm join 192.168.5.3:6443 --token 0mtxqm.ucoojki6c4od2ojb --discovery-token-ca-cert-hash sha256:02e3b1b30ade0998bc6d70453d1a0c9143ca7e802fea9ef01e065973816bed56 |
在master上查看节点信息
1 | [root@master ~]# kubectl get nodes |
13 安装网络插件,只在master节点操作即可
1 | [root@master ~]# wget https://github.com/flannel-io/flannel/tree/master/Documentation/kube-flannel.yml |
由于外网不好访问,如果出现无法访问的情况,可以直接用下面的 记得文件名是kube-flannel.yml,位置:/root/kube-flannel.yml内容:
1 |
|
使用配置文件启动fannel
1 | kubectl apply -f kube-flannel.yml |
等待它安装完毕 发现已经是 集群的状态已经是Ready
注意此处可能久一点,
安装问题
此处出现以下日志,不影响
1 | [root@master ~]# kubectl apply -f kube-flannel.yml |
安装问题
若localhost.localdomain NotReady
1 |
|
解决办法
修改主机名称
修改配置文件 /etc/hostname 保存退出
进入vi,删除旧主机名,输入新主机名,Esc后冒号 wq退出保存,重启生效
1 | [root@master ~]# vi /etc/hostname |
然后,主节点,和字节点重置
1 | kubeadm reset |
再重新执行 集群初始化
14.使用kubeadm reset重置集群
在master节点之外的节点进行操作
1 | [root@node01 ~]# kubeadm reset |
重启kubelet
1 | [root@node01 ~]# systemctl restart kubelet |
重启docker
1 | [root@node01 ~]# systemctl restart docker |
15.重启kubelet和docker
1 | # 重启kubelet |
使用配置文件启动fannel
1 | [root@node01 ~]# kubectl apply -f kube-flannel.yml |
等待它安装完毕 发现已经是 集群的状态已经是Ready
16.kubeadm中的命令
1 | # 生成 新的token |
七、集群测试
1.创建一个nginx服务
1 | [root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine |
2.暴露端口
1 | [root@master ~]# kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort |
3.查看服务
1 | [root@master ~]# kubectl get pod,svc |
4.查看pod
1 | [root@master ~]# kubectl get nodes |
1 | [root@master ~]# kubectl get pod,svc |
1 | [root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine |
1 | [root@master ~]# kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort |
1 | [root@master ~]# kubectl get pod,svc |
1 | [root@master ~]# kubectl get pod |
浏览器测试结果:
浏览器访问:
http://192.168.5.3:31818/
http://192.168.5.4:31818/
http://192.168.5.5:31818/
一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;